package org.linlinjava.litemall.db.service;

import org.linlinjava.litemall.db.dao.LitemallGoodsStatsMapper;
import org.linlinjava.litemall.db.domain.LitemallGoodsStats;
import org.linlinjava.litemall.db.domain.LitemallGoodsStatsExample;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class LitemallGoodsStatsService {
    @Resource
    private LitemallGoodsStatsMapper goodsStatsMapper;

    /**
     * 根据商品ID查询访问统计
     */
    public List<LitemallGoodsStats> queryByGoodsId(Integer goodsId) {
        LitemallGoodsStatsExample example = new LitemallGoodsStatsExample();
        example.createCriteria().andGoodsIdEqualTo(goodsId);
        example.setOrderByClause("access_time desc");
        return goodsStatsMapper.selectByExample(example);
    }

    /**
     * 根据商品ID和时间范围查询访问统计
     */
    public List<LitemallGoodsStats> queryByGoodsIdAndTimeRange(Integer goodsId, LocalDateTime startTime, LocalDateTime endTime) {
        LitemallGoodsStatsExample example = new LitemallGoodsStatsExample();
        example.createCriteria()
                .andGoodsIdEqualTo(goodsId)
                .andAccessTimeGreaterThanOrEqualTo(startTime)
                .andAccessTimeLessThanOrEqualTo(endTime);
        example.setOrderByClause("access_time desc");
        return goodsStatsMapper.selectByExample(example);
    }

    /**
     * 统计商品总访问次数
     */
    public long countByGoodsId(Integer goodsId) {
        LitemallGoodsStatsExample example = new LitemallGoodsStatsExample();
        example.createCriteria().andGoodsIdEqualTo(goodsId);
        return goodsStatsMapper.countByExample(example);
    }

    /**
     * 统计商品在指定时间范围内的访问次数
     */
    public long countByGoodsIdAndTimeRange(Integer goodsId, LocalDateTime startTime, LocalDateTime endTime) {
        LitemallGoodsStatsExample example = new LitemallGoodsStatsExample();
        example.createCriteria()
                .andGoodsIdEqualTo(goodsId)
                .andAccessTimeGreaterThanOrEqualTo(startTime)
                .andAccessTimeLessThanOrEqualTo(endTime);
        return goodsStatsMapper.countByExample(example);
    }

    /**
     * 添加访问记录
     */
    public int add(LitemallGoodsStats goodsStats) {
        goodsStats.setAccessTime(LocalDateTime.now());
        return goodsStatsMapper.insertSelective(goodsStats);
    }

    /**
     * 记录商品访问
     */
    public void recordAccess(Integer goodsId, String ip, String userAgent) {
        LitemallGoodsStats stats = new LitemallGoodsStats();
        stats.setGoodsId(goodsId);
        stats.setIp(ip);
        stats.setUserAgent(userAgent);
        stats.setAccessTime(LocalDateTime.now());
        goodsStatsMapper.insertSelective(stats);
    }

    /**
     * 获取最近的访问记录
     */
    public List<LitemallGoodsStats> getRecentAccess(Integer goodsId, int limit) {
        LitemallGoodsStatsExample example = new LitemallGoodsStatsExample();
        example.createCriteria().andGoodsIdEqualTo(goodsId);
        example.setOrderByClause("access_time desc limit " + limit);
        return goodsStatsMapper.selectByExample(example);
    }

    /**
     * 删除指定商品的所有访问记录
     */
    public int deleteByGoodsId(Integer goodsId) {
        LitemallGoodsStatsExample example = new LitemallGoodsStatsExample();
        example.createCriteria().andGoodsIdEqualTo(goodsId);
        return goodsStatsMapper.deleteByExample(example);
    }
}